package com.xianniu.ltc.service;

import cn.devezhao.persist4j.engine.ID;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.xianniu.ltc.model.entity.TProjectDTO;
import com.xianniu.ltc.model.entity.TProjectDetailDTO;
import com.xianniu.ltc.model.po.*;
import com.xxl.sso.core.entity.ReturnT;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;

/**
 * @author WangRuiJie
 * @Title: ProjectService
 * @Package com.xianniu.ltc.service
 * @Description: 项目服务类
 * @date 2021/5/314:58 下午
 */
public interface ProjectService {
    /**
     * 查询项目列表
     * @param param
     * @return
     */
    ReturnT projectPage(ProjectQueryPO param);

    /**
     * New-查询项目列表
     * @param param
     * @return
     */
    ReturnT projectList(ProjectQueryPO param);

    /**
     * API-查询项目每个阶段的数量
     * @param param
     * @return
     */
    ReturnT projectCount(ProjectCountPO param);

    /**
     * 项目修改基本信息
     * @param po
     * @return
     */
    ReturnT projectUpdate(ProjectUpdatePO po);

    /**
     * 查询项目详情
     * @param param
     * @return
     */
    ReturnT projectDetail(ProjectQueryPO param);

    /**
     * 根据关联数据ID查询项目详情
     * @param entityId
     * @return
     */
    TProjectDetailDTO selectByEntityId(String entityId, String tenantCode);

    /**
     * 根据项目ID查询项目信息
     * @param entityId
     * @param tenantCode
     * @return
     */
    TProjectDTO selectProjectByProjectId(String entityId, String tenantCode);

    /**
     * 新增项目
     * @param param
     */
    void initProject(ProjectAddPO param);

    /**
     * 新增项目用户关系
     * @param param
     */
    void addProjectUser(ProjectUserPO param);

    /**
     * 删除项目用户关系
     * @param param
     */
    void delProjectUser(ProjectUserPO param);

    /**
     * 新增项目明细
     * @param param
     */
    void addProjectDetail(ProjectAndDetailUpdatePO param, String projectId);

    /**
     * 删除项目明细
     * @param entityIds
     * @param tenantCode
     */
    void deleteProjectDetail(List<String> entityIds, String tenantCode);

    /**
     * 更新项目
     * @param param
     */
    void updateProjectAndDetail(ProjectAndDetailUpdatePO param);

    /**
     * 查询项目对应的商机
     * @param param
     * @return
     */
    ReturnT selectNiche(ProjectQueryRelatedPO param);

    /**
     * 查询项目商机的客户信息
     * @param param
     * @return
     */
    ReturnT selectCustomerInfo(ProjectQueryRelatedPO param);

    /**
     * 项目：查询当前人在某个模块中拥有的实体权限集合
     * @param param
     * @return
     */
    ReturnT selectEntityCodeList(ProjectQueryRelatedPO param, JSONArray navs);

    /**
     * 项目：查询当前人在申请审批拥有的实体权限集合
     * @param param
     * @return
     */
    ReturnT selectApprovalList(ProjectQueryRelatedPO param, JSONArray navs);


    /**
     * 根据项目ID查询对应实体的列表数据
     * @param param
     * @return
     */
    ReturnT selectEntityInfoList(ProjectQueryRelatedPO param);

    /**
     * 根据项目ID查询对应实体的列表数据
     * @param param
     * @return
     */
    ReturnT selectProjectReport(ProjectReportPO param);

    /**
     *
     * @param projectNo
     * @return
     */
    ReturnT balanceOfPayments(String projectNo) throws Exception;
}
